<?php

namespace app\api\controller;
/**
 * This file is part of workerman.
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the MIT-LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @author walkor<walkor@workerman.net>
 * @copyright walkor<walkor@workerman.net>
 * @link http://www.workerman.net/
 * @license http://www.opensource.org/licenses/mit-license.php MIT License
 */

/**
 * 用于检测业务代码死循环或者长时间阻塞等问题
 * 如果发现业务卡死，可以将下面declare打开（去掉//注释），并执行php start.php reload
 * 然后观察一段时间workerman.log看是否有process_timeout异常
 */
declare(ticks=1);

use app\api\model\GameOperate;
use \GatewayWorker\Lib\Gateway;
use Workerman\Lib\Timer;

/**
 * 主逻辑
 * 主要是处理 onConnect onMessage onClose 三个方法
 * onConnect 和 onClose 如果不需要可以不用实现并删除
 */
class Events extends Api
{
    /**
     * {@inheritdoc}
     * rules:
     * actions 控制器列表: * 全部控制器
     * roles 允许访问角色:
     * all 全部;
     * no_all 不允许任何人进;
     * login 登录(默认);
     * allow 验证规则:
     * no_checkTime 不验证时间戳;
     * no_checkSign  不验证签名;
     */
    protected $auth = [
        [
            'actions' => ['*'],
            'roles' => 'all',
            'allow' => [],
        ]
    ];


    //心跳设置
    public static function onWorkerStart($businessWorker)
    {
        Timer::add(1, function () use ($businessWorker) {
            $res = (new GameOperate())->roomCurrent();
            Gateway::sendToAll($res);
        });
    }


//    /**
//     * 当客户端连接时触发
//     * 如果业务不需此回调可以删除onConnect
//     *
//     * @param int $client_id 连接id
//     */
    public static function onWebSocketConnect($client_id, $data)
    {
        //绑定uid
        if (isset($data['get']['token'])) {
            $res = (new GameOperate())->websocketBindUid($data['get']['token'], $client_id);
            if ($res == false) {
                Gateway::closeClient($client_id);
            }
        }

    }

    /**
     * 当客户端发来消息时触发
     * @param int $client_id 连接id
     * @param mixed $message 具体消息
     */
    public static function onMessage($client_id, $message)
    {
        // 向所有人发送 
        Gateway::sendToAll("");
    }

    /**
     * 当用户断开连接时触发
     * @param int $client_id 连接id
     */
    public static function onClose($client_id)
    {
        // 向所有人发送
        GateWay::sendToAll("$client_id logout\r\n");
    }
}
